/*
    该文件定义文件上传模块

    定义文件上传函数uploadFile()
    @params string filePath 文件存储路径
    @params array fileTypes 允许上传的文件类型
    @params number fileMaxSize 允许上传的文件大小最大值
*/
var multer = require('multer');
var timestamp = require('time-stamp');
var path = require('path');
var uid = require('uid');   //随机字符串生成模块

function uploadFile(filePath,fileTypes,fileMaxSize){
    //创建存储引擎
    var filenameWithOutExt = timestamp("YYYYMMDDHHmmssms") + uid(10);
    var storage = multer.diskStorage({
        //定义存储的位置
        destination: filePath,
        //定义文件名
        filename:function (req,file,cb) {
            //文件名: 格式化时间戳+随机数+扩展名
            var fileExtName = path.extname(file.originalname);  //文件扩展名
            var filename = filenameWithOutExt + fileExtName;//新生成的文件名
            //保存文件
            cb(null,filename);
        },
        limits:{
            fileSize: fileMaxSize
        }
    });

    //定义文件过滤的函数
    function fileFilter(req,file,cb){
        //console.log(file);
        var fileExtName = path.extname(file.originalname);  //文件扩展名
        var fileType = file.mimetype;   //文件类型

        //console.log("allowed types: "+fileTypes);
        //console.log("file type: "+fileType);

        if(fileTypes.indexOf(fileType) != -1){ //上传文件类型在指定的范围内

            cb(null,true);
        }else{//上传文件类型不在指定范围内
            
            var err = new Error();
            err.code = "FILE_TYPE_ERROR";
            cb(err);
            cb(null,false);
            //console.log("only image file are allowed to upload");
        }
        return file;
    }

    //配置文件上传器
    var upload = multer({
        //上传文件保存的位置
        //dest:'./uploads' //设置之后启动项目会自动创建uploads文件夹
        
        //使用diskStorage进行存储 如果在这里使用了 就不用再额外设置dest属性了
        storage: storage,//存储引擎
        fileFilter: fileFilter
    });
    return {
        upload:upload,
        filename:filenameWithOutExt
    };

}

module.exports = uploadFile;
